//An esbuild plugin is an object with a `name` and a `setup` function.
//They are passed in an array to the build API call.
//The setup function is run once for each build API call.

const path = require("path");
let exampleOnLoadPlugin = {
  name: 'example',
  setup(build){
    let fs = require('fs');

    console.log('build.initialOptions:',build.initialOptions);
/* 就是我们在build.js里输入的
build.initialOptions: {
  entryPoints: [
    'F:\\code\\js_workplace\\tutorial\\esbuild_tutorial\\02.plugins\\00.basic\\src\\index.js'
  ],
  bundle: true,
  outdir: 'dist',
  loader: { '.png': 'dataurl' },
  plugins: [ { name: 'example', setup: [Function: setup] } ]
}
*/
    // 可以在这里覆盖
    // build.initialOptions.outdir = 'lib'
    // 但在配置开始后 无法进行修改

    //
    /*build.onStart(()=>{
      //↓ onStart里进行修改 是无效的
      build.initialOptions.outdir = 'lib'
    })*/

    //
    build.onResolve({filter: /\.txt$/}, async (args) =>{
      console.log('build.onResolve args:',args);

      //这里返回的对象 会作为后续钩子接受的 args
      return  ({
        path: args.path,
        namespace: 'txt'
      })
    });

    // Load '.txt' files and return an array of words
    build.onLoad({
      //必填, 指定要匹配的文件
      // filter: /\.txt$/ //也可以写成一个函数的形式 返回true就是匹配, 但这没直接写正则性能高, 因为这里的正则会放在go里去执行

      //如果上面拦截了.txt文件 并为其设置了单独的命名空间, 那么这里可以不用filter 而是用上面设定好的命名空间 (但需要使用个全局的filter, 因为filter是必填的。。。)
      filter: /\.*/,
      namespace: 'txt'
    }, async (args) => {
      console.log('build.onLoad args:', args);
      let text = await fs.promises.readFile(path.resolve(__dirname, 'src', args.path), 'utf-8');
      return {
        //↓ 必填
        contents: JSON.stringify(text.split(/\s+/)),
        //上面返回的contents 会用json这个loader去加载
        loader: 'json'
        // ↕ 等价
        // contents: `export defauot ${JSON.stringify(text.split(/\s+/))}`
        // ↑ 因为js、jsx类型是esbuild本身就支持的
      }
    });


    //
    // build.onEnd()
  }
}

module.exports = exampleOnLoadPlugin;
